package com.dashboard.domain;

import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;

import org.springframework.security.GrantedAuthority;
import org.springframework.security.GrantedAuthorityImpl;
import org.springframework.security.userdetails.UserDetails;

@Entity
@Table(name = "users")
public class Usuario implements UserDetails
{
	/**
	 * 
	 */
	private static final long serialVersionUID = 4134601894792298154L;
	
	private static final int LOGIN_TAMANHO = 50;
	
	private static final int AUTORIZACAO_TAMANHO = 50;

	@Id
	@Column(name = "username", length = LOGIN_TAMANHO)
	private String login;

	@Column(name = "password", length = AUTORIZACAO_TAMANHO)
	private String senha;

	@Column(name = "enabled")
	private Boolean ativo;
	
	@OneToMany(mappedBy = "usuario", cascade = {CascadeType.ALL})
	private Set<Autorizacoes> autorizacoes;
	
	@ManyToOne
	@JoinColumn(name = "id_organizacao")
	private Organizacao organizacao;
	
	/**
	 * @return the login
	 */
	public String getLogin()
	{
		return login;
	}

	/**
	 * @param login the login to set
	 */
	public void setLogin(String login)
	{
		this.login = login;
	}

	/**
	 * @return the senha
	 */
	public String getSenha()
	{
		return senha;
	}

	/**
	 * @param senha the senha to set
	 */
	public void setSenha(String senha)
	{
		this.senha = senha;
	}

	/**
	 * @return the ativo
	 */
	public Boolean getAtivo()
	{
		return ativo;
	}

	/**
	 * @param ativo the ativo to set
	 */
	public void setAtivo(Boolean ativo)
	{
		this.ativo = ativo;
	}

	/**
	 * @return the autorizacoes
	 */
	public Set<Autorizacoes> getAutorizacoes()
	{
		return autorizacoes;
	}

	/**
	 * @param autorizacoes the autorizacoes to set
	 */
	public void setAutorizacoes(Set<Autorizacoes> autorizacoes)
	{
		this.autorizacoes = autorizacoes;
	}

	/**
	 * @return the organizacao
	 */
	public Organizacao getOrganizacao()
	{
		return organizacao;
	}

	/**
	 * @param organizacao the organizacao to set
	 */
	public void setOrganizacao(Organizacao organizacao)
	{
		this.organizacao = organizacao;
	}

	/**
	 * {@inheritDoc}
	 */
	@Transient	
	public boolean isAccountNonExpired() 
	{
		return true;
	}

	/**
	 * {@inheritDoc}
	 */
	@Transient
	public boolean isAccountNonLocked() 
	{
		return true;
	}

	/**
	 * {@inheritDoc}
	 */
	@Transient
	public boolean isCredentialsNonExpired() 
	{
		return true;
	}

	/**
	 * {@inheritDoc}
	 */
	@Transient
	public boolean isEnabled() 
	{
		return ativo;
	}

	/**
	 * {@inheritDoc}
	 */
	@Transient
	public GrantedAuthority[] getAuthorities() 
	{
		GrantedAuthority[] authorities = new GrantedAuthority[0];
		
		if (autorizacoes != null)
		{
			authorities = new GrantedAuthority[autorizacoes.size()];
			
			int i = 0;
			for (Autorizacoes role : autorizacoes)
			{
				authorities[i++] = new GrantedAuthorityImpl(role.getAutorizacao());
			}
		}
		
		return authorities;
	}
	
	/**
	 * {@inheritDoc}
	 */
	public String getPassword()
	{
		//TODO verificar
		return null;
	}
	
	/**
	 * {@inheritDoc}
	 */
	public String getUsername()
	{
		//TODO verificar
		return null;
	}
}